////////////////////////////////////////////////////////////////////////////////
//
//  FLEX USER GROUP HOKURIKU
//  Copyright 2009 Flex User Group Hokuriku
//  All Rights Reserved.
// 
//  NOTICE: Flex User Group Hokuriku permits you to use, 
//  modify, and distribute this file 
//  in accordance with the terms of the license agreement accompanying it.
//
////////////////////////////////////////////////////////////////////////////////
package net.fxug.hokuriku.chocolat.model
{
    import flash.errors.IllegalOperationError;

    import net.fxug.hokuriku.chocolat.events.VoteEvent;

    /**
     * Applicationレベルでスコープ管理されるデータクラス。Singleton
     * TODO セッションIDのgetterで未定義時にエラーを投げるように実装する。
     * @author hikaruworld
     */
    public class ApplicationDataModel
    {
        /** 自身を表すインスタンス */
        private static var instance:ApplicationDataModel;

        /** セッションID */
        [Bindalble]
        public var sessionId:int;

        // TODO 以下のプロパティはSpeakerViewHelperとTimlineTimer間で利用されるプロパティのため、
        // 後ほどクラスを別に定義する必要がある。
        /** へぇコメント総数 */
        [Bindalble]
        public var goodComment:String = "-- へぇ";
        /** ぶぅコメント総数 */
        [Bindalble]
        public var badComment:String = "--- ぶぅ";
        /** 評価 */
        [Bindalble]
        public var feedback:String = "コメントが見つからなかったようです。";

        /** へぇの回数 */
        private var goodCnt:int = 0;
        /** ぶぅの回数 */
        private var badCnt:int = 0;


        /**
         * コンストラクタ
         * @param blockr インスタンス生成制御用
         */
        public function ApplicationDataModel(blockr:SingletonBlockr = null)
        {
            if (blockr == null)
            {
                throw new IllegalOperationError("Can not create instance");
            }
        }

        /**
         * Singletonなインスタンスを返す
         * @return 自身の一意なインスタンス
         */
        public static function getInstance():ApplicationDataModel
        {
            if (instance == null)
            {
                instance = new ApplicationDataModel(new SingletonBlockr());
            }
            return instance;
        }

        /**
         * カウントアップする。
         * @param vote net.fxug.hokuriku.chocolat.events.VoteEvent#type
         */
        public function addVote(vote:String):void
        {
            if (vote == null || vote.length == 0)
            {
                return;
            }
            if (vote == VoteEvent.GOOD_EVENT)
            {
                this.goodCnt++;
            }
            else if (vote == VoteEvent.BAD_EVENT)
            {
                this.badCnt++;
            }
        }

        /**
         * へぇメッセージを取得する。
         * @return へぇメッセージ
         */
        public function getGoodMessage():String
        {
            if (this.goodCnt <= 0)
            {
                return goodComment;
            }
            return this.goodCnt + " へぇ";
        }

        /**
         * ぶぅメッセージを取得する。
         * @return ぶぅメッセージ
         */
        public function getBadMessage():String
        {
            if (this.badCnt <= 0)
            {
                return badComment;
            }
            return this.badCnt + " ぶぅ";
        }

        /**
         * フィードバックコメントを取得する
         * @return スティーブジョブスかどうか。
         */
        public function getFeedbackMessage():String
        {
			if (this.goodCnt == 0 && this.badCnt == 0)
			{
				return this.feedback;
			}
            return this.goodCnt - this.badCnt > 0 ? "あなたのスピーカーとしての腕はスティーブ・ジョブス並みと言えるでしょう。" : "たいへんよく出来ました。"
        }
    }
}

/** インスタンス生成抑止用 */
internal class SingletonBlockr
{
}